package com.duke.duke.javaagent.base01;

import com.duke.duke.javaagent.base01.example.command.MemoryCommand;

import java.lang.instrument.Instrumentation;

/**
 * @author gjy
 * @create 2024-11-22 11:28 AM
 */
public class AgentMain {
    /**
     * 静态加载模式
     * premain 方法在目标 JVM 中实际运行 agent 的线程中执行，因此 premain 方法不能修改目标 JVM 的状态。
     *
     * 参数：agentArgs agent参数
     * instrumentation agent运行时的环境
     * @param agentArgs
     * @param inst
     */
    public static void premain(String agentArgs, Instrumentation inst) {
        System.out.println("preMain 执行了...");
    }

    /**
     * 动态加载模式
     * agentmain 方法在目标 JVM 中实际运行 agent 的线程中执行，因此 agentmain 方法不能修改目标 JVM 的状态。
     * agentmain方法在 premain 方法之后执行，并且是在目标JVM 中实际运行 agent 的线程中执行，因此 agentmain 方法可以修改目标 JVM 的状态。
     *
     * 参数：agentArgs agent参数
     * instrumentation agent运行时的环境
     * @param agentArgs
     * @param inst
     */
    public static void agentmain(String agentArgs, Instrumentation inst) {
        System.out.println("agentmain 执行了...");

        // 打印内存信息
        MemoryCommand.printMemoryInfo();
    }

}
